package org.linlinjava.litemall.web.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class ListToMapUtil {
    
    /**
     * 将List转换为Map
     * 
     * @param list     待转换的List
     * @param keyFunc  提取Map的键的函数
     * @return         转换后的Map
     * @throws        IllegalStateException 如果List中包含重复的键
     */
    public static <T, K> Map<K, T> toMap(List<T> list, Function<T, K> keyFunc) {
        Map<K, T> map = new HashMap<>();
        for (T obj : list) {
            K key = keyFunc.apply(obj);
            if (map.put(key, obj) != null) {
                throw new IllegalStateException("Duplicate key " + key);
            }
        }
        return map;
    }
    
    /**
     * 将List转换为Map，并指定合并函数
     * 
     * @param list          待转换的List
     * @param keyFunc       提取Map的键的函数
     * @param mergeFunc     合并重复键的值的函数
     * @return              转换后的Map
     */
    public static <T, K> Map<K, T> toMap(List<T> list, Function<T, K> keyFunc, 
                                         Function<T, T> mergeFunc) {
        Map<K, T> map = new HashMap<>();
        for (T obj : list) {
            K key = keyFunc.apply(obj);
            T value = mergeFunc.apply(obj);
            map.merge(key, value, (v1, v2) -> {
                throw new IllegalStateException("Duplicate key " + key);
            });
        }
        return map;
    }
    

}
